package pl.edu.pw.mini.java2.Communicator.Client;

import javax.sound.sampled.*;
import javax.swing.JOptionPane;

/**
 * Klasa odpowiedzialna za pobranie dzwieku z mikrofonu i wysłanie przez sieć. 
 * @author Dymitr Załunin, Kamil Łysik
 */
public class MicrophoneCollecter extends Thread {
	private volatile boolean isRecording;
	private Client client;

	/**
	 * Konstruktor tworzący nową instancje klienta.
	 * @param c Klient z którego są wysyłane wiadomości.
	 */
	public MicrophoneCollecter(Client c) {
		client = c;
	}

	/**
	 * Uruchamianie wątku pobierania i wysyłania dzwieku.
	 */
	public void run() {
		// INIT
		setIsRecording();
		AudioFormat format = SoundPlayer.getFormat();
		DataLine.Info targetInfo;
		TargetDataLine targetLine;
		targetInfo = new DataLine.Info(TargetDataLine.class, format);
		try {
			targetLine = (TargetDataLine) AudioSystem.getLine(targetInfo);
			targetLine.open(format);
			targetLine.start();
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null, "Cannot find or use microphone.");
			return;
		}
		final int bufferSize = (int) format.getSampleRate()
				* format.getFrameSize();
		while (true) {
			if (!isRecoring())
				break;
			byte buffer[] = new byte[bufferSize];
			int count = targetLine.read(buffer, 0, buffer.length);
			if (count > 0)
				client.sendChatVoiceMessage(buffer);
		}
		targetLine.close();
	}

	private synchronized void setIsRecording() {
		isRecording = true;
	}

	private synchronized void setIsNotRecording() {
		isRecording = false;
	}

	private synchronized boolean isRecoring() {
		return isRecording;
	}

	/**
	 * Metoda przerywająca wątek pobierania dzwięku z mikrofonu.
	 */
	public void stopRecording() {
		setIsNotRecording();
		try {
			this.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
